home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
usenet
/
sources
/
volume90
/
util
/
rm
/
rm.asm
< prev
next >
Wrap
Assembly Source File
|
1990-01-28
|
7KB
|
388 lines
;- :ts=12 --------------------------------------------------------
;
; rm -- remove files with Oops! possibility
;
; /|||\ (c) Copyright 1989 by Martin J. Laubach
; //|||\\ All rights reserved
; ///|||\\\
;
;-----------------------------------------------------------------
ifd CAPE
optimon
addsym
objfile "rm.o"
endc
include "exec/types.i"
include "exec/alerts.i"
include "exec/libraries.i"
include "libraries/dos.i"
include "arp/arpbase.i"
call macro
ifnd _LVO\1
xref _LVO\1
endc
jsr _LVO\1(a6)
endm
xref _LVOAlert
ScratchSiz: equ 256
JunkSiz: equ 80
section Remove,code
;---------------------------------------------------------------------------
; Try to open arp.library first. Write NoArp text if failure
main: RESIDENT 3000
movem.l a0/d0,-(a7)
move.l 4,a6
lea ArpN(pc),a1
moveq #34,d0
call OpenLibrary
tst.l d0
bne.s ArpOK
lea DosN(pc),a1
moveq #34,d0
call OpenLibrary
tst.l d0
bne.s DosOK
;-------------------------------------
; Recoverable alert if no dos.library found
alertDos: ALERT (AG_OpenLib!AO_DOSLib)
EFail: moveq #RETURN_FAIL,d0
rts
;-------------------------------------
; Write OhAhNoArp text for user without arp.library
; Expects DOSBase in D0
DosOK: move.l d0,a6
call Output
move.l d0,d1
lea NoArp(pc),a0
move.l a0,d2
moveq #NoArpEnd-NoArp,d3
call Write
move.l a6,a1
move.l 4,a6
call CloseLibrary
bra.s EFail
;-------------------------------------
; Arp opened ok, now parse the command line
; Expects ArpBase in D0
ArpOK: move.l d0,a6
movem.l (a7)+,a0/d0
lea CLIHelp(pc),a1
lea -4(a7),a7
move.l a7,a2
lea CLITemp(pc),a3
call GADS
move.l (a7),a5
lea 4(a7),a7
;-------------------------------------
; Check parameters, write usage if less than one
; Expects D0 number of paramaters
tst.l d0
bne.s ParamOK
lea Usage(pc),a1
call Puts
bra.s EFail
;--------------------------------------------------------------------------
; Parameters ok, begin to work on them
; D0: argument count
; A5: argument vector
ParamOK: move.l d0,d7
lea -JunkSiz(a7),a7
move.l a7,a2
lea Junk(pc),a0
move.l a2,a1
moveq #JunkSiz,d0
call Getenv
tst.b (a2)
bne.s NoEnv
lea Junk(pc),a2
NoEnv: subq.l #1,d7
moveq #0,d5
moveq #0,d6
lea -ScratchSiz(a7),a7
move.l a7,a3
NextPar: move.l #SIGBREAKF_CTRL_C,d1
sub.l a1,a1
call CheckBreak
tst.l d0
bne BreakRcvd
move.l (a5)+,a4
;-------------------------------------
; Check if parameter contains | # ?
; Expects ¶meter to check in A4, A3 scratch buffer
Chk4Pat: move.l a4,a1
;;; moveq #0,d1
1$: move.b (a1)+,d0
beq.s NoPattern
cmp.b #'?',d0
beq.s Pattern
cmp.b #'|',d0
beq.s Pattern
cmp.b #'#',d0
bne.s 1$
;-------------------------------------
; Yes, must do pattern matching
; A4 supplied file name, A3 scratch buffer
; D6 return code, D5 return value
Pattern: lea -ap_SIZEOF-256(a7),a7
move.l #SIGBREAKF_CTRL_C,ap_BreakBits(a7)
move.l #256,ap_Length(a7)
move.l a4,d0
move.l a7,a0
call FindFirst
1$: move.l d0,d6
bne.s NoFiles
tst.l d5
bne.s NoFiles
lea ap_SIZEOF(a7),a4
bsr.s Remove
;;; tst.l d0
bne.s 2$
moveq #RETURN_FAIL,d5
2$: move.l a7,a0
call FindNext
bra.s 1$
NoFiles: tst.l d6
beq.s 1$
cmp.w #ERROR_NO_MORE_ENTRIES,d6
beq.s 1$
moveq #RETURN_FAIL,d5
1$: move.l a7,a0
call FreeAnchorChain
lea ap_SIZEOF+256(a7),a7
bra.s EndLoop
;-------------------------------------
; No, normal remove will do
; A4 File name, A3 scratch buffer
; D5 return value
NoPattern: bsr.s Remove
;;; tst.l d0
bne.s EndLoop
moveq #RETURN_FAIL,d5
move.l #ERROR_OBJECT_NOT_FOUND,d6
EndLoop: tst.l d5
dbne.s d7,NextPar
lea ScratchSiz+JunkSiz(a7),a7
;-------------------------------------
; End this program
ExitOK: moveq #0,d2
move.l d5,d0
beq.s Exit
move.l d6,d2
Exit: call ArpExit
rts
;-------------------------------------
; Break received -- print "***break" and exit program
; Expects pointer to break string in A1
BreakRcvd: call Puts
bra.s ExitOK
move.l #ERROR_BREAK,d2
ExitFail: moveq #RETURN_FAIL,d0
bra.s Exit
RmRet: moveq #0,d0
rts
;--------------------------------------------------------------------------
; Remove a file.
; in: A4 = filename to be removed
; A3 = 256 bytes scratch buffer area
;
; return 0 if failure, <>0 if remove succeeded
Remove:
;-------------------------------------
; Locate the complete file name
; Expects A4 filename, A3 scratch area
move.l a4,d1
move.l #ACCESS_READ,d2
call Lock
move.l d0,d3
beq.s Prnt
move.l a3,a0
move.l #256,d1
call PathName
move.l d3,d1
call UnLock
;-------------------------------------
; Print information
; Expects A3 full file name
Prnt: tst.l d3
bne.s 1$
move.l a4,-(a7)
lea RemStr(pc),a0
move.l a7,a1
call Printf
lea 4(a7),a7
lea Nofile(pc),a1
call Puts
bra.s RmRet
1$: move.l a3,-(a7)
lea RemStr(pc),a0
move.l a7,a1
call Printf
lea 4(a7),a7
;-------------------------------------
; Isolate drive name
; Expects A3 full file name
Isolate: move.l a3,a0
1$: move.b (a0)+,d0
cmp.b #':',d0
bne.s 1$
clr.b (a0)
;-------------------------------------
; Build path for rename
; Expects A2 "junk" dir name, A3 full file name, A4 original file name
move.l a3,a0
move.l a2,a1
call TackOn
move.l a4,a0
call BaseName
move.l d0,a1
move.l a3,a0
call TackOn
;-------------------------------------
; Munch file name so it is unique and doesn't exist
; Expects A3 full file name to move to
moveq #1,d4
FindEnd: move.l a3,a0
1$: tst.b (a0)+
bne 1$
lea -1(a0),a0
move.l a0,d3
ChkEx: move.l a3,d1
move.l #ACCESS_READ,d2
call Lock
move.l d0,d1
beq.s 1$
call UnLock
movem.l a2/a3/a6,-(a7)
lea FileFmt(pc),a0 ; Format string
move.l d4,-(a7)
addq.l #1,d4
move.l a7,a1 ; Output values
move.l d3,a3 ; Output buffer
move.l 4,a6
lea StuffChar(pc),a2
call RawDoFmt
lea 4(a7),a7
movem.l (a7)+,a2/a3/a6
bra.s ChkEx
;-------------------------------------
; Now rename the file
; Expects A3 new, unique junk file name, A4 original file name
1$: move.l a4,d1
move.l a3,d2
Ren: call Rename
move.l d0,d3
beq.s 1$
lea Success(pc),a1
bra.s 2$
1$: lea Failed(pc),a1
2$: call Puts
move.l d3,d0
rts
;-------------------------------------
; StuffChar, used for Sprintf style formatting
StuffChar: move.b d0,(a3)+
rts
;-------------------------------------
;-------------------------------------
RemStr: dc.b 'Removing %s...',0
FileFmt: dc.b ';%ld',0
Success: dc.b 'done',0
Failed: dc.b 'failed',0
Nofile: dc.b 'not found',0
Junk: dc.b 'Junk',0
CLITemp: dc.b 'FILES/'
Think: dc.b '...',0
CLIHelp: dc.b 'Files to remove',0
Usage: dc.b 'Usage: rm <file> ...',0
DosN: dc.b 'dos.library',0
ArpN: ArpName
NoArp: dc.b 'You need arp.library V34+'
NoArpEnd:
TestByte: dc.b $a
end